#include "jeu.h"

#include "case.h"
#include "joueur.h"
#include "joueuriadifficile.h"
#include "joueuriafacile.h"
#include "joueurinterface.h"
#include "plateau.h"

#include <QtCore/QDebug>

Jeu::Jeu() {
	m_j1 = NULL;
	m_j2 = NULL;
}

Jeu::~Jeu() {
	delete m_j1;
	delete m_j2;
}

void Jeu::init(QString pJoueur1, Types::TypesJoueurs pTypeJoueur1, QString pJoueur2, Types::TypesJoueurs pTypeJoueur2) {
	// Suppression des joueurs et plateaux existants
	delete m_j1;
	m_j1 = NULL;
	delete m_j2;
	m_j2 = NULL;


	m_j1 = creerJoueur(pJoueur1, pTypeJoueur1, 1);
	m_j2 = creerJoueur(pJoueur2, pTypeJoueur2, 2);
	m_plateau = Plateau();
	//connect(&m_plateau, SIGNAL(sig_nbGrainesModifie(int,int)), this, SIGNAL(sig_nbGrainesModifies(int,int)));

	emit sig_init(m_j1, m_j2);
	lancer();
}

Joueur* Jeu::creerJoueur(const QString& pNom, Types::TypesJoueurs pTypeJoueur, int pNumero) {
	Joueur* j;
	switch (pTypeJoueur) {
	case Types::Joueur:
		j = new JoueurInterface(pNumero, pNom);
		break;

	case Types::IAFacile:
		j = new JoueurIAFacile(pNumero, pNom);
		break;

	case Types::IADifficile:
		j = new JoueurIADifficile(pNumero, pNom);
		break;

	default:
		j = NULL;
		break;
	}

	if (j)
		connect(this, SIGNAL(sig_quitter()), j, SLOT(quitter()));

	return j;
}

void Jeu::lancer() {
	int i = 1;
	while (!m_plateau.termine()) {
		// Au joueur i de jouer
		Joueur* j = (i == 1 ? m_j1 : m_j2);
		emit sig_tour(j);
		Plateau pEtatPrec = m_plateau;
		int pos = j->jouer_t(m_plateau);
		emit sig_tourJoue(pos, i);

		j->prendreGraines(m_plateau.jouerCoup(pos));

		for (int k = 0; k < 12; ++k) {
			if (pEtatPrec.m_cases[k]->nbGraines() != m_plateau.m_cases[k]->nbGraines())
				emit sig_nbGrainesModifies(k, m_plateau.m_cases[k]->nbGraines());
		}

		i = 3 - i;
	}

	Joueur* gagnant = (m_j1->nbGraines() > m_j2->nbGraines() ? m_j1 : m_j2);
	Joueur* perdant = (m_j1 == gagnant ? m_j2 : m_j1);

	emit sig_partieFinie(gagnant, perdant);
}
